package com.ideal.util;

import com.ideal.config.Constant;
import com.ideal.dto.DictInfoDto;
import com.ideal.dto.FileConfigResultDto;
import com.ideal.dto.config.AvailableConfig;
import com.ideal.enums.FileTypeEnum;
import com.ideal.util.file.ExeclUtil;
import com.ideal.util.file.IniUtil;
import com.ideal.util.file.PropertiesUtil;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
* @Author: lilei
* @Description: 文件工具类
* @date: 2022/7/15
*/
public class FileUtils {

    //可重入锁，保证一个文件夹生成
    final static ReentrantLock LOCK = new ReentrantLock();
    private static Logger LOG =Logger.getLogger(FileUtils.class);

    /**
     * 根据文件类型读取内容
     * @param path
     * @param globalNoteList 全局注释标识符集合
     * @return
     */
    public static String readContext(String path, List<DictInfoDto> globalNoteList) throws UnsupportedEncodingException {

        String suffix = path.substring(path.lastIndexOf(".") + 1);

        if (FileTypeEnum.EXECL.getSubfix().equalsIgnoreCase(suffix)) {

            return ExeclUtil.readContext(path);
        } else if (FileTypeEnum.INI.getSubfix().equals(suffix)) {

            return IniUtil.readContext(path, globalNoteList);
        } else if (FileTypeEnum.PROPERTIES.getSubfix().equals(suffix)) {

            return PropertiesUtil.readContext(path);
        } else {
            return null;
        }
    }
    /**
     * 上传文件
     * @param file
     * @return
     */
    public static FileConfigResultDto upload(String path,MultipartFile file){
        FileConfigResultDto fileConfigResultDto = new FileConfigResultDto();
        if (file==null){
            return null;
        }
        StringBuffer filePathBuffer = new StringBuffer();
        String datePath = DateUtils.formatDate(new Date(), Constant.configFolderDatePath);
        filePathBuffer.append(path).append("\\").append(datePath);
        String originFilename = file.getOriginalFilename();
        assert originFilename != null;
        String[] split = originFilename.split("\\.");
        ///文件名
        String fileName = split[0]+"_"+"version_"+DateUtils.formatDate(new Date(), Constant.HHMMSSSSS)+"."+split[1];
        //文件路径
        String filePath =null;
        try {
            File newFilePath = new File(filePathBuffer.toString());
            //判断文件夹是否存在
            if (!newFilePath.exists() && !newFilePath.isDirectory()) {
                try {
                    if (!LOCK.tryLock(5, TimeUnit.SECONDS)) {
                        throw new RuntimeException("系统忙碌，文件上传失败，请重新上传");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    //判断文件夹是否存在
                    if (!newFilePath.exists() && !newFilePath.isDirectory()) {
                        if (!newFilePath.mkdirs()) {
                            throw new RuntimeException("文件上传失败，请重新上传");
                        }
                    }
                } finally {
                    LOCK.unlock();
                }
            }
            filePath = filePathBuffer.append("\\").append(fileName).toString();
            //生成文件
            file.transferTo(new File(filePath));

        } catch (IOException e) {
            e.printStackTrace();
        }
        fileConfigResultDto.setFileName(fileName);
        fileConfigResultDto.setFilePath(filePath);
        return fileConfigResultDto;
    }

}
